package response

import (
	"encoding/json"
	"time"

	"github.com/flipped-aurora/gin-vue-admin/server/model/matchs"
)

// AskTaskVO 问问任务列表展示结构体
// @Summary 问问任务列表展示结构体
// @Description 包含任务ID、问题内容、目标专业ID数组等字段
// @Tags 问问模块
// @Accept json
// @Produce json
type AskTaskVO struct {
	Id                    uint      `json:"id"`                    // 任务ID
	Content               string    `json:"content"`               // 问题内容
	TargetProfessionalIDs []uint    `json:"targetProfessionalIds"` // 目标专业ID数组
	IsAnonymous           int8      `json:"isAnonymous"`           // 是否匿名
	Status                int8      `json:"status"`                // 任务状态
	StatusDesc            string    `json:"statusDesc"`            // 状态描述
	PushedCount           int       `json:"pushedCount"`           // 已推送用户数
	RemainingMinutes      int       `json:"remainingMinutes"`      // 剩余有效期（分钟）
	CreatedAt             time.Time `json:"createdAt"`             // 创建时间
	ExpireAt              time.Time `json:"expireAt"`              // 过期时间
}

// ConvertToAskTaskVO 将 MatchAskTask 转换为 AskTaskVO
// @description: 将数据库模型转换为API响应模型
// @param: task *matchs.MatchAskTask 数据库模型对象
// @return: AskTaskVO API响应模型对象
func ConvertToAskTaskVO(task *matchs.MatchAskTask) AskTaskVO {
	// 状态映射字典
	statusMap := map[int8]string{
		matchs.MatchAskStatusPending:   "待匹配",
		matchs.MatchAskStatusMatching:  "匹配中",
		matchs.MatchAskStatusReplied:   "已收到回复",
		matchs.MatchAskStatusAccepted:  "已接受回复",
		matchs.MatchAskStatusCompleted: "已结束",
		matchs.MatchAskStatusExpired:   "已超时",
	}

	// 反序列化TargetProfessionalIDs 这里是想把string记录的ids转换为数组
	var professionalIDs []uint
	if err := json.Unmarshal([]byte(task.TargetProfessionalIDs), &professionalIDs); err != nil {
		// 如果反序列化失败，返回空数组
		professionalIDs = []uint{}
	}

	return AskTaskVO{
		Id:                    task.ID,
		Content:               task.Content,
		IsAnonymous:           task.IsAnonymous,
		TargetProfessionalIDs: professionalIDs,
		Status:                task.Status,
		StatusDesc:            statusMap[task.Status],
		PushedCount:           task.PushedCount,
		RemainingMinutes:      task.RemainingMinutes,
		CreatedAt:             task.CreatedAt,
		ExpireAt:              task.ExpireAt,
	}
}
